#pragma once

#include <any>
#include <cstring>
#include <unordered_map>
#include "Alice/Log/Log.h"

namespace Alice
{

// 事件 ID
using EventId = unsigned int;

/* 
    事件类
    包装一个事件
    不允许空事件
*/ 
class Event
{
public:
    /* 
        不允许创建空事件
    */ 
    Event() = delete;

    /* 
        不允许进行隐式类型转换
    */ 
    explicit Event(EventId ID) : m_ID(ID) {}

    /* 
        设置事件携带的参数
    */ 
    template<typename T>
    void SetParam(std::string param_name, T value)
    {
        m_params[ param_name ] = value;
    }

    /* 
        获取事件携带的参数
    */ 
    template<typename T>
    T GetParam(std::string param_name)
    {
        assert(m_params.find(param_name) != m_params.end() && 
            "Parameter does not exist!");

        return std::any_cast<T>(m_params[ param_name ]);
    }

    /* 
        获取事件的 ID
    */ 
    EventId GetId()
    {
        return m_ID;
    }

private:
    // 事件的 ID
    EventId m_ID;
    // 事件发生时收集的参数
    std::unordered_map<std::string, std::any> m_params;
};

} // namespace Alice

